package main.字串;

/**
 * @author tmh
 * @date 2024/7/17 19:17
 * @description
 */
public class T560和为K的子数组 {

    public int subarraySum(int[] nums, int k) {
        //双重循环，暴力解法
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            int sum = 0;
            for (int j = i; j < nums.length; j++) {
                sum = sum + nums[j];
                if (sum == k) {
                    count++;
                    //这个count++后面不要break;比如[-1,1,0]，有三个，如果有break，
                    //那么就只能统计[-1,1]，统计不了[-1,1,0]
                }
            }
        }
        return count;
    }

    public int subarraySum1(int[] nums, int k) {
        int count = 0;
        //定义前缀和数组
        int[] preSum = new int[nums.length + 1];
        //给前缀和数组赋值
        for (int i = 0; i < nums.length; i++) {
            //举例：前面两个数的和等于第一个数的和加上第二个数
            preSum[i + 1] = nums[i] + preSum[i];
        }
        for (int i = 0; i < nums.length; i++) {
            for (int j = i; j < nums.length; j++) {
                //可以理解为 动的 减去 不动的，preSum[0]=0
                //当i，j都为0的时候，下面表示的是 从第一个到第j个元素的和等不等于k
                if (preSum[j + 1] - preSum[i] == k) {
                    count++;
                }
            }
        }
        return count;
    }
}
